﻿<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="GoogleMapForASPNet.ascx.cs" Inherits="STT.Home.GoogleMapForASPNet" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>
<asp:ScriptManager ID="ScriptManager1" runat="server">
 <Services>
    <asp:ServiceReference Path="~/Home/GService.asmx" />
    <asp:ServiceReference Path="~/Home/GoogleMapForASPNet.ascx" />
  </Services>
</asp:ScriptManager>
<div id="GoogleMap_Div" style="width:<%=GoogleMapObject.Width %>;height:<%=GoogleMapObject.Height %>;">

</div>
<div id="directions_canvas">

</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:HiddenField ID="hidEventName" runat="server" />
    <asp:HiddenField ID="hidEventValue" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>

<script src="http://maps.google.com/maps?file=api&amp;v=<%=GoogleMapObject.APIVersion %>&amp;key=<%=GoogleMapObject.APIKey %>"  type="text/javascript"></script>
<script language="JavaScript">

    function RaiseEvent(pEventName, pEventValue) {
        document.getElementById('<%=hidEventName.ClientID %>').value = pEventName;
        document.getElementById('<%=hidEventValue.ClientID %>').value = pEventValue;
        __doPostBack('UpdatePanel1', '');
    }

    var map;
    var trafficInfo = null;

    function fMarkers() {
        this.markers = new Array();
        this.getLength = function () { return this.markers.length; };
        this.pushValue = function (v) { this.markers.push(v); }
        this.getValue = function (i) { return this.markers[i]; }
        this.getLastValue = function () { return this.markers[this.markers.length - 1]; }
        this.getValueById = function (ID) {
            var i;
            for (i = 0; i < this.markers.length; i++) {
                if (this.markers[i].value == ID) {
                    // alert('marker found : '+this.markers[i].value);
                    return this.markers[i];
                }
            }
            return null;
        }
        this.removeValueById = function (ID) {
            var i;
            for (i = 0; i < this.markers.length; i++) {
                if (this.markers[i].value == ID) {
                    // alert('marker found : '+this.markers[i].value);
                    this.markers.splice(i, 1);
                    //alert('changed marker removed');

                }
            }
            return null;
        }
    }

    function fPolylines() {
        this.polylines = new Array();
        this.polylinesID = new Array();
        this.getLength = function () { return this.polylines.length; };
        this.pushValue = function (v, ID) { this.polylines.push(v); this.polylinesID.push(ID); }
        this.getValue = function (i) { return this.polylines[i]; }
        this.getLastValue = function () { return this.polylines[this.polylines.length - 1]; }
        this.getValueById = function (ID) {
            var i;
            for (i = 0; i < this.polylinesID.length; i++) {
                if (this.polylinesID[i] == ID) {
                    // alert('polyline found : '+this.polylines[i].value);
                    return this.polylines[i];
                }
            }
            return null;
        }
        this.removeValueById = function (ID) {
            var i;
            for (i = 0; i < this.polylinesID.length; i++) {
                if (this.polylinesID[i] == ID) {
                    this.polylines.splice(i, 1);
                    this.polylinesID.splice(i, 1);
                }
            }
            return null;
        }
    }

    function fPolygons() {
        this.polygons = new Array();
        this.polygonsID = new Array();
        this.getLength = function () { return this.polygons.length; };
        this.pushValue = function (v, ID) { this.polygons.push(v); this.polygonsID.push(ID); }
        this.getValue = function (i) { return this.polygons[i]; }
        this.getLastValue = function () { return this.polygons[this.polygons.length - 1]; }
        this.getValueById = function (ID) {
            var i;
            for (i = 0; i < this.polygonsID.length; i++) {
                if (this.polygonsID[i] == ID) {
                    return this.polygons[i];
                }
            }
            return null;
        }
        this.removeValueById = function (ID) {
            var i;
            for (i = 0; i < this.polygonsID.length; i++) {
                if (this.polygonsID[i] == ID) {
                    this.polygons.splice(i, 1);
                    this.polygonsID.splice(i, 1);
                }
            }
            return null;
        }
    }

    if (GBrowserIsCompatible()) {
        //debugger;
        //GoogleMapForASPNet.OnSecondChange("Ghata");
        map = new GMap2(document.getElementById("GoogleMap_Div"));

        var markers = new fMarkers();
        var polylines = new fPolylines();
        var polygons = new fPolygons();
        //var myEventListeners = new fListeners();

        function CreateMarker(point, icon1, InfoHTML, bDraggable, sTitle) {
            var marker;
            //    if(icon!=null)
            //    {
            marker = new GMarker(point, { icon: icon1, draggable: bDraggable, title: sTitle });
            //    }
            //    else
            //    {
            //        marker = new GMarker(point);
            //    }
            if (InfoHTML != '') {
                // vlisteners.pushValue(GEvent.addListener(marker, "click", function() { map.openInfoWindowHtml(point,InfoHTML); }));
                GEvent.addListener(marker, "click", function () { map.openInfoWindowHtml(point, InfoHTML); });
                GEvent.addListener(marker, "dragend", function () { GService.SetLatLon(this.value, this.getLatLng().y, this.getLatLng().x); RaiseEvent('PushpinMoved', this.value); });
            }
            return marker;
        }

        function CreatePolyline(points, color, width, isgeodesic) {
            var polyline;
            if (!isgeodesic) {
                polyline = new GPolyline(points, color, width);
            }
            else {
                var polyOptions = { geodesic: true };
                polyline = new GPolyline(points, color, width, 1, polyOptions);
            }
            return polyline;
        }

        function CreatePolygon(points, strokecolor, strokeweight, strokeopacity, fillcolor, fillopacity) {
            var polygon;

            var polygon = new GPolygon(points, strokecolor, strokeweight, strokeopacity, fillcolor, fillopacity);
            return polygon;
        }

        function fGetGoogleObject(result, userContext) {
            map.setCenter(new GLatLng(result.CenterPoint.Latitude, result.CenterPoint.Longitude), result.ZoomLevel);

            if (result.ShowMapTypesControl) {
                map.addControl(new GMapTypeControl());
            }

            if (result.ShowZoomControl) {
                map.addControl(new GLargeMapControl());
            }

            var i;
            if (markers != null) {
                for (i = 0; i < markers.getLength() ; i++) {
                    var cmark = markers.getValue(i);
                    if (cmark != null) {
                        map.removeOverlay(cmark);
                    }
                }
            }
            //    if(myEventListeners!=null)
            //    {
            //        for(i=0;i<myEventListeners.getLength();i++)
            //        {
            //            var lisnr = myEventListeners.getValue(i);
            //            if(lisnr!=null)
            //            {
            //                GEvent.removeListener(lisnr);
            //            }
            //        }
            //    }  
            markers = new fMarkers();
            //    myEventListeners = new fListeners();

            for (i = 0; i < result.Points.length; i++) {
                var myIcon_google;

                var myPoint = new GLatLng(result.Points[i].Latitude, result.Points[i].Longitude);

                myIcon_google = null;
                if (result.Points[i].IconImage != '') {
                    myIcon_google = new GIcon(G_DEFAULT_ICON);
                    markerOptions = { icon: myIcon_google };

                    myIcon_google.iconSize = new GSize(result.Points[i].IconImageWidth, result.Points[i].IconImageHeight);
                    myIcon_google.image = result.Points[i].IconImage;
                }

                var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
                marker.value = result.Points[i].ID;
                markers.pushValue(marker);
                map.addOverlay(markers.getLastValue());
            }
            //Add polylines
            // alert('adding polyline');

            polylines = new fPolylines();
            for (i = 0; i < result.Polylines.length; i++) {
                var polypoints = new Array();
                var j;
                for (j = 0; j < result.Polylines[i].Points.length; j++) {
                    polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
                }
                var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
                polylines.pushValue(polyline, result.Polylines[i].ID);
                map.addOverlay(polylines.getLastValue());
            }
            // var polypoints = new Array();
            // polypoints.push(new GLatLng(43.65669, -79.44268));
            // polypoints.push(new GLatLng(43.66619, -79.44268));
            // var poly = CreatePolyline(polypoints,"#66FF00",10,true);
            // map.addOverlay(poly);

            // var polypoints = new Array();
            // polypoints.push(new GLatLng(43.65669, -79.44268));
            // polypoints.push(new GLatLng(43.66619, -79.44268));
            // polypoints.push(new GLatLng(43.67619, -79.44268));
            // var directions = new GDirections(map,document.getElementById("directions_canvas")); 
            //Clear the mapa nd directions of any old information
            //directions.clear();

            //Load the map and directions from the specified waypoints
            //directions.loadFromWaypoints(polypoints);


            polygons = new fPolygons();
            for (i = 0; i < result.Polygons.length; i++) {
                var polypoints = new Array();
                var j;
                for (j = 0; j < result.Polygons[i].Points.length; j++) {
                    polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
                }
                var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
                polygons.pushValue(polygon, result.Polygons[i].ID);
                map.addOverlay(polygons.getLastValue());
            }


            if (result.ShowTraffic) {
                trafficInfo = new GTrafficOverlay();
                map.addOverlay(trafficInfo);
            }
        }
        GService.GetGoogleObject(fGetGoogleObject);

        function fGetGoogleObjectOptimized(result, userContext) {
            if (result.RecenterMap) {
                map.setCenter(new GLatLng(result.CenterPoint.Latitude, result.CenterPoint.Longitude), result.ZoomLevel);
                GService.RecenterMapComplete();
            }

            if (result.ShowTraffic) {
                trafficInfo = new GTrafficOverlay();
                map.addOverlay(trafficInfo);
            }
            else {
                if (trafficInfo != null) {
                    map.removeOverlay(trafficInfo);
                    trafficInfo = null;
                }
            }

            var i;
            for (i = 0; i < result.Points.length; i++) {
                //Create icon
                var myIcon_google;

                var myPoint = new GLatLng(result.Points[i].Latitude, result.Points[i].Longitude);

                myIcon_google = null;
                if (result.Points[i].IconImage != '') {
                    myIcon_google = new GIcon(G_DEFAULT_ICON);
                    markerOptions = { icon: myIcon_google };

                    myIcon_google.iconSize = new GSize(result.Points[i].IconImageWidth, result.Points[i].IconImageHeight);
                    myIcon_google.image = result.Points[i].IconImage;
                }
                //Existing marker, but changed.
                if (result.Points[i].PointStatus == 'C') {
                    var marker = markers.getValueById(result.Points[i].ID);
                    if (marker != null) {
                        markers.removeValueById(result.Points[i].ID);
                        map.removeOverlay(marker);
                    }
                    var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
                    marker.value = result.Points[i].ID;
                    markers.pushValue(marker);
                    map.addOverlay(markers.getLastValue());
                }
                //New Marker
                if (result.Points[i].PointStatus == 'N') {
                    var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
                    marker.value = result.Points[i].ID;
                    markers.pushValue(marker);
                    map.addOverlay(markers.getLastValue());
                }
                //Existing marker, but deleted.
                if (result.Points[i].PointStatus == 'D') {
                    var marker = markers.getValueById(result.Points[i].ID);
                    if (marker != null) {
                        markers.removeValueById(result.Points[i].ID);
                        map.removeOverlay(marker);
                    }
                }
            }

            //Get Polylines
            for (i = 0; i < result.Polylines.length; i++) {
                //Existing marker, but changed.

                if (result.Polylines[i].LineStatus == 'C') {

                    var polyline = polylines.getValueById(result.Polylines[i].ID);
                    if (polyline != null) {
                        polylines.removeValueById(result.Polylines[i].ID);
                        map.removeOverlay(polyline);
                    }
                    var polypoints = new Array();
                    var j;
                    for (j = 0; j < result.Polylines[i].Points.length; j++) {
                        polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
                    }
                    var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
                    polylines.pushValue(polyline, result.Polylines[i].ID);
                    map.addOverlay(polylines.getLastValue());
                }
                //New Marker

                if (result.Polylines[i].LineStatus == 'N') {
                    var polypoints = new Array();
                    var j;
                    for (j = 0; j < result.Polylines[i].Points.length; j++) {
                        polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
                    }
                    var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
                    polylines.pushValue(polyline, result.Polylines[i].ID);
                    map.addOverlay(polylines.getLastValue());
                }
                //Existing marker, but deleted.
                if (result.Polylines[i].LineStatus == 'D') {
                    var polyline = polylines.getValueById(result.Polylines[i].ID);
                    if (polyline != null) {
                        polylines.removeValueById(result.Polylines[i].ID);
                        map.removeOverlay(polyline);
                    }
                }
            }

            //Get Polygons
            for (i = 0; i < result.Polygons.length; i++) {
                //Existing marker, but changed.

                if (result.Polygons[i].Status == 'C') {

                    var polygon = polygons.getValueById(result.Polygons[i].ID);
                    if (polygon != null) {
                        polygons.removeValueById(result.Polygons[i].ID);
                        map.removeOverlay(polygon);
                    }
                    var polypoints = new Array();
                    var j;
                    for (j = 0; j < result.Polygons[i].Points.length; j++) {
                        polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
                    }
                    var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
                    polygons.pushValue(polygon, result.Polygons[i].ID);
                    map.addOverlay(polygons.getLastValue());
                }
                //New Marker

                if (result.Polygons[i].Status == 'N') {
                    var polypoints = new Array();
                    var j;
                    for (j = 0; j < result.Polygons[i].Points.length; j++) {
                        polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
                    }
                    var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
                    polygons.pushValue(polygon, result.Polygons[i].ID);
                    map.addOverlay(polygons.getLastValue());
                }
                //Existing marker, but deleted.
                if (result.Polygons[i].Status == 'D') {
                    var polygon = polygons.getValueById(result.Polygons[i].ID);
                    if (polygon != null) {
                        polygons.removeValueById(result.Polygons[i].ID);
                        map.removeOverlay(polygon);
                    }
                }
            }
        }

    }
    function endRequestHandler(sender, args) {
        //alert('hi');
        GService.GetOptimizedGoogleObject(fGetGoogleObjectOptimized);
    }
    function pageLoad() {
        if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack())
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
    }
</script>
